package cn.ant.mqHandle;

import cn.ant.config.RabbitMQConfig;
import cn.ant.entity.MessageSendDTO;
import com.alibaba.fastjson2.JSONObject;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/***
 * 消费者
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
@Slf4j
@Component
public class PriorityConsumer {

    /***
     * 简单消息处理（监听）；@RabbitListener注解就是用来监听对应的队列
     * @param msgData 监听消息队列中下消息（生产者发送什么类型数据，这里就用对应类型接收，一般都是JSON字符串）
     * @param message 这个就类似我们原生的message
     * @param channel 这个就类似我们原生的channel
     */
    @RabbitListener(queues = {RabbitMQConfig.PRIORITY_QUEUE_NAME})
    public void messageSimpleHandle(@Payload String msgData, // 这个是生产者发送的JSON消息
                                    @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,
                                    Message message,
                                    Channel channel) throws InterruptedException, IOException {
        // 获取到队列消息，因为发送是JSON格式，我们要解析对象格式
        // message.getBody()：存储消息的具体内容（序列化后的二进制数据）
        String msgJsonStr = new String(message.getBody(), StandardCharsets.UTF_8);
        MessageSendDTO msg = JSONObject.parseObject(msgJsonStr, MessageSendDTO.class);
        // 假设消费者处理消息慢，每2秒处理一条
        Thread.sleep(2000);
        log.info("消息由消费者消费：{}，并消费完成", msg);
        // 手动确认，注：这个deliveryTag可以通过message.getMessageProperties().getDeliveryTag()拿到
        channel.basicAck(deliveryTag, false);
    }
}
